/*
Guillaume COLLOMBET
*/

#ifndef IMAGE_H_INCLUDED
#define IMAGE_H_INCLUDED

#include "pixel.h"

/*!
\struct Image "Une image avec une largeur, une hauteur et un talbeau de pixel.
*/
struct Image {
    int dimx;
    int dimy;
    Pixel* pix;
} typedef Image;

/*!
*\fn imInit(Image*, int, int)
*\brief Initialise l'image passé en argument.
*\param image Adresse de l'image à initialisé
*\param widht largeur de l'image.
*\param heigth hauteur de l'image.
*/
void imInit(Image* image, int widht, int heigth);

/*!
*\fn imCreer(int, int)
*\brief Retourne l'adresse d'une image initialisé aux dimensions passées en arguments.
*\param widht Largeur de l'image.
*\param heigth Hauteur de l'image.
*\return Return l'adresse de l'image
*/
Image* imCreer(int widht, int heigth);

/*!
*\fn imLibere(Image*)
*\brief Libère la mémoire allouée dans la structure passée en argument.
*\param image Adresse de l'image dont la mémoire doit être libéré.
*/
void imLibere(Image* image);

/*!
*\fn imDetruit(Image*)
*\brief Detruit en mémoire l'image dont l'adresse est passée en argument.
*\param image Adresse de l'image qui doit être détruite en mémoire.
*/
void imDetruit(Image* image);

/*!
*\fn const Pixel* getPix(const Image* iamge, int widht, int heigth)
*\brief Obtient l'adresse du pixel aux coordonnées passées en argument.
*\param image Adresse de l'image dans laquel obtenir le pixel.
*\param x Coordonée en absice du pixel.
*\param y Coordonée en ordonnée du pixel.
*\return Retourne l'adresse du pixel.
*/
const Pixel* getPix(const Image* image, int x, int y);

/*!
*\fn void setPix(Image*, int, int, const Pixel*)
*\brief Définie le pixel aux coordonnées et à la couleur passées en argument.
*\param image Adresse de l'image dans laquel obtenir le pixel.
*\param x Coordonée en absice du pixel.
*\param y Coordonée en ordonnée du pixel.
*\param pixel Couleur du pixel.
*/
void setPix(Image* image, int x, int y, const Pixel* pixel);

/*!
*\fn void imEffacer(Image*, const Pixel*)
*\brief Efface l'image à la couleur passées en argument.
*\param image Adresse de l'image à effacer.
*\param pixel Adresse du pixel définissant la couleur.
*/
void imEffacer(Image* image, const Pixel* pixel);

/*!
*\fn void imDessineRect(Image* image, int x, int y, int widht, int heigth, const Pixel* pixel)
*\brief Dessine un rectangle sur l'image
*\param image Image sur laquelle dessiner
*\param x int coordonnées des l'absice du rectangle à dessiner
*\param y int coordonnées de l'ordonnée du rectangle à dessiner
*\param widht int largeur de l'image à dessiner
*\param height int hauteur de l'image à dessiner
*\param pixel Pixel couleur du rectangle à dessiner
*/
void imDessineRect(Image*, int, int, int, int, const Pixel*);

/*!
*\fn void imSauver(const Image *pIm, const char filename[])
*\brief Enregistre l'image passée en argument au chemin d'accèes passé en argument
*\param pIm const Image* adresse de l'image à enregistrée
*\param filename char* chemin d'accès du fichier
*/
void imSauver(const Image *pIm, const char filename[]);

/*!
*\fn void imOuvrir(Image *pIm, const char filename[])
*\brief Ouvre l'image passée en argument au chemin d'accèes passé en argument
*\param pIm const Image* adresse de l'image dans laquelle copier les données de l'image ouverte
*\param filename char* chemin d'accès du fichier
*/
void imOuvrir(Image *pIm, const char filename[]);

/*!
*\fn void imPrintf(const Image *pIm)
*\brief Affiche l'image sur la sortie standard
*\param pIm const Image* adresse de l'image
*/
void imPrintf(const Image *pIm);

#endif // IMAGE_H_INCLUDED
